package com.wdb007.venus.svc.biz.manager;

import java.util.Comparator;
import java.util.TreeMap;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.github.wxpay.sdk.WXPayConfig;

/**
 * 微信相关工具类,在获取各个TreeMap的时候，三个基本元素appid，mch_id，nonce_str，都已经有了
 * @author 张俊伟
 *
 */
@Component
public class WeChatUtilManager {
	
    @Autowired
    private WXPayConfig config;
	@Autowired
	private ConfigInfoManager configInfoManager;
	/**
	 * 微信支付中用于生成订单号
	 * @return
	 */
	public String getRandomNumber() {
		return UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
	}
	/**
	 * 得到一个按照key的字典顺序排序的map
	 * @return
	 */
	private TreeMap<String,String> getTreeMap() {
		TreeMap<String,String> treeMap = new TreeMap<>(new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				return o1.compareTo(o2);
			}
			
		});
		//在组装模板的时候
		return treeMap;
	}
	/**
	 * 获取统一下单的TreeMap
	 * 统一下单接口
	 * 应用Id和商户号统一使用同一个；appid,mch_id
	 * 设备号：device_info,默认为WEB
	 * 随机字符串：nonce_str，根据随机数生成算法产生
	 * 签名：sign，根据签名生成算法产生
	 * 签名类型：sign_type，默认为MD5
	 * 商品描述：body，应用市场上的APP名字-实际商品名称，例如：天天爱消除-游戏充值。
	 * 商户订单号：out_trade_no（32位）时间加随机数
	 * 货币类型：fee_type，默认为CNY
	 * 总金额：total_fee，订单总金额，单位为分，接口中参数支付金额单位为【分】，参数值不能带小数。对账单中的交易金额单位为【元】。
	 * 终端IP：spbill_create_ip，用户端实际ip，例如：123.12.12.123
	 * 通知地址：notify_url，接收微信支付异步通知回调地址，通知url必须为直接可访问的url，不能携带参数
	 * 交易类型：trade_type，默认为APP
	 * @return
	 */
	public TreeMap<String, String> getTreeMapUnifiedOrder() {
		TreeMap<String, String> treeMap = getTreeMap();
		// 将一些初始数据放入
		treeMap.put("device_info", "WEB");
		treeMap.put("body", "我的邦-客户充值");// 商品描述
		treeMap.put("out_trade_no", "");// 订单号
		treeMap.put("fee_type", "CNY");
		treeMap.put("total_fee", "");// 这里需要注意，xml中竟然指定为int值
		treeMap.put("spbill_create_ip", "");// 终端Ip
		treeMap.put("notify_url", configInfoManager.getValue("wechat.notify"));// 通知地址
		treeMap.put("trade_type", "APP");
		// 后面再调用的时候，需要补充完	订单号	订单金额，	终端Ip	三个参数
		return treeMap;
	}
	/**
	 * 主动查询订单的TreeMap
	 */
	public TreeMap<String,String> getTreeMapQueryOrder(){
		TreeMap<String, String> treeMap = getTreeMap();
		// 将一些初始数据放入
		treeMap.put("out_trade_no","");//商户系统内部订单号
		// 后面再调用的时候只需要补充	商户订单号
		return treeMap;
	}
	/**
	 * 
	 * @Method:getTreeMapDodownloadBill
	 * @Description:微信对账单的TreeMap
	 * @Time 2017年8月30日 下午5:25:28
	 * @author: Tom
	 * @return
	 */
	public TreeMap<String,String> getTreeMapDodownloadBill(){
		TreeMap<String, String> treeMap = getTreeMap();
		// 将一些初始数据放入
		treeMap.put("appid", config.getAppID());// 应用ID
		treeMap.put("mch_id", config.getMchID());// 商户ID
		treeMap.put("nonce_str", getRandomNumber());// 随机字符串
		treeMap.put("sign_type", "MD5");
		treeMap.put("bill_date", "");//ALL，返回当日所有订单信息，默认值
		//SUCCESS，返回当日成功支付的订单
		//REFUND，返回当日退款订单
		//RECHARGE_REFUND，返回当日充值退款订单
		treeMap.put("bill_type", "");
		// 后面再调用的时候只需要补充	对账单日期 20170820 对账单类型
		return treeMap;
	}
	/**
	 * 
	 * @Method:getTreeMapRefundOrder
	 * @Description:申请退款的TreeMap
	 * @Time 2017年8月29日 下午1:26:30
	 * @author: Tom
	 * @return
	 */
	public TreeMap<String,String> getTreeMapRefundOrder(){
		TreeMap<String, String> treeMap = getTreeMap();
		// 将一些初始数据放入
		treeMap.put("sign_type","MD5");
		treeMap.put("out_trade_no","");//商户系统内部订单号
		//treeMap.put("transaction_id", "");//微信生成的订单号，在支付通知中有返回
		treeMap.put("out_refund_no","");//商户系统内部的退款单号
		treeMap.put("total_fee","");
		treeMap.put("refund_fee","");
		treeMap.put("refund_fee_type","CNY");
		// 后面再调用的时候只需要补充	商户系统内部订单号，订单金额，
		return treeMap;
	}
	/**
	 * 
	 * @Method:getPlaceReturn
	 * @Description:统一下单后重新计算签名返回给前段
	 * @Time 2017年8月29日 下午2:05:39
	 * @author: Tom
	 * @return
	 */
	public TreeMap<String,String> getPlaceReturn(){
		TreeMap<String, String> treeMap = getTreeMap();
		// 将一些初始数据放入
		treeMap.put("prepayid", "");// 预支付订单号
		treeMap.put("package","Sign=WXPay");
		treeMap.put("noncestr","");
		treeMap.put("timestamp","");
		//还需要填充三个 随机字符串，预支付订单号，时间
		return treeMap;
	}
	
	public WXPayConfig getWxPayConfig() {
		return config;
	}
}
